home *** CD-ROM | disk | FTP | other *** search
/ Java 1996 August / Java - Summer 1996.iso / kaffe-0.2 / kaffe / soft1.c < prev    next >
C/C++ Source or Header  |  1996-02-12  |  2KB  |  165 lines

  1. /*
  2.  * soft1.c
  3.  * Soft instruction implementations.
  4.  *
  5.  * Copyright (c) 1996 Systems Architecture Research Centre,
  6.  *           City University, London, UK.
  7.  *
  8.  * See the file "license.terms" for information on usage and redistribution
  9.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  10.  *
  11.  * Written by Tim Wilkinson <tim@sarc.city.ac.uk>, February 1996.
  12.  */
  13.  
  14. #include "gtypes.h"
  15. #include "needs.h"
  16. #include "md.h"
  17.  
  18. #ifdef NEED_soft_lmul
  19. /*
  20.  * Multiple two longs (64 bits).
  21.  */
  22. void
  23. soft_lmul(long long v2, long long v1)
  24. {
  25.     *(&v1) = v1 * v2;
  26. }
  27. #endif
  28.  
  29. #ifdef NEED_soft_ldiv
  30. /*
  31.  * Divide two longs (64 bits).
  32.  */
  33. void
  34. soft_ldiv(long long v2, long long v1)
  35. {
  36.     *(&v1) = v1 / v2;
  37. }
  38. #endif
  39.  
  40. #ifdef NEED_soft_lrem
  41. /*
  42.  * Divide two longs (64 bits) and retrieve remainder.
  43.  */
  44. void
  45. soft_lrem(long long v2, long long v1)
  46. {
  47.     *(&v1) = v1 % v2;
  48. }
  49. #endif
  50.  
  51. #ifdef    NEED_soft_frem
  52. void
  53. soft_frem(float v2, float v1)
  54. {
  55.     *(&v1) = v1 - (int)(v1 / v2) * v2;
  56. }
  57. #endif
  58.  
  59. #ifdef    NEED_soft_drem
  60. void
  61. soft_drem(double v2, double v1)
  62. {
  63.     *(&v1) = v1 - (int)(v1 / v2) * v2;
  64. }
  65. #endif
  66.  
  67. #ifdef    NEED_soft_lshl
  68. void
  69. soft_lshl(uint32 i1, long long v1)
  70. {
  71.     *(&v1) = v1 << i1;
  72. }
  73. #endif
  74.  
  75. #ifdef    NEED_soft_lshr
  76. void
  77. soft_lshr(uint32 i1, long long v1)
  78. {
  79.     *(&v1) = v1 >> i1;
  80. }
  81. #endif
  82.  
  83. #ifdef    NEED_soft_lushr
  84. void
  85. soft_lushr(uint32 i1, unsigned long long v1)
  86. {
  87.     *(&v1) = v1 >> i1;
  88. }
  89. #endif
  90.  
  91. #ifdef NEED_soft_lcmp
  92. void
  93. soft_lcmp(long long v2, long long v1)
  94. {
  95.     long long ret;
  96.  
  97.     if (v1 > v2) {
  98.         ret = 1;
  99.     }
  100.     else if (v1 == v2) {
  101.         ret = 0;
  102.     }
  103.     else {
  104.         ret = -1;
  105.     }
  106.     *(&v1) = ret << 32;
  107. }
  108. #endif
  109.  
  110. #ifdef NEED_soft_fcmpl
  111. void
  112. soft_fcmpl(float v2, float v1)
  113. {
  114.     int ret;
  115.     if (v1 > v2) {
  116.         ret = 1;
  117.     }
  118.     if (v1 == v2) {
  119.         ret = 0;
  120.     }
  121.     else {
  122.         ret = -1;
  123.     }
  124.     *(int*)&v1 = ret;
  125. }
  126. #endif
  127.  
  128. #ifdef NEED_soft_fcmpg
  129. void
  130. soft_fcmpg(double v2, double v1)
  131. {
  132.     long long ret;
  133.     if (v1 > v2) {
  134.         ret = 1;
  135.     }
  136.     if (v1 == v2) {
  137.         ret = 0;
  138.     }
  139.     else {
  140.         ret = -1;
  141.     }
  142.     *(long long*)&v1 = ret << 32;
  143. }
  144. #endif
  145.  
  146. #ifdef NEED_soft_dcmpl
  147. void
  148. soft_dcmpl(double v2, double v1)
  149. {
  150.     long long ret;
  151.     ret = v1 < v2;
  152.     *((long long*)&v1) = ret << 32;
  153. }
  154. #endif
  155.  
  156. #ifdef NEED_soft_dcmpg
  157. void
  158. soft_dcmpg(double v2, double v1)
  159. {
  160.     long long ret;
  161.     ret = v1 > v2;
  162.     *((long long*)&v1) = ret << 32;
  163. }
  164. #endif
  165.